package cn.kgc.springmvc.servlet;

import cn.kgc.springmvc.entity.User;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author 课工场
 * @date 2024/5/5
 * @description   /hello   ->  HelloServlet
 *
 * 重写方法
 *   form   method        restful
 *   get      获取数据     /user
 *   post      添加数据    /user
 *   put        修改数据   /user
 *   delete     删除数据    /user
 *   option     前后端分离的模式下  预检请求  访问服务器是否允许跨域

 *   doGet()
 *   doPost()
 *   service()     用户的路径一旦匹配某个servlet 会自动调用service方法
 *
 *   servlet的任务分析 ?
 *   1. 接收请求
 *   2.作出响应
 *
 *   传统的servlet问题分析
 *    1. 请求参数接收的过程比较繁琐
 *    2.接收参数的类型单一  String
 *         根据数据的类型不同 可能需要数据类型转换  为了避免空指针异常的出现  在转换之前需要进行数据非空的判定
 *    3. 如果参数较多 需要封装数据  多次调用set
 *    4. 根据业务层处理的结果进行页面的转发或重定向时
 *         1.存在路径耦合
 *         2.视图的耦合    login.jsp  login.html      login
 *    5. 响应json格式的数据 需要手动设置  过程繁琐
 *    6. 相同的异常需要多次处理 代码冗余
 *
 *   springmvc框架可以帮助解决以上问题
 *       1. 参数接收
 *       2.视图耦合
 *       3.简化json个数数据响应的过程   添加注解
 *       4.简化异常处理方案
 */
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //  1.接收请求参数     繁琐
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String age = req.getParameter("age");
        String sex = req.getParameter("sex");

        //  2. 请求参数的封装
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setAge(Integer.valueOf(age));
        user.setSex(Integer.valueOf(sex));

        //  3. 调用业务层 实现业务处理    user-> service


        // 4. 根据业务层的处理结果 作出响应    注册  ->   ok  请求的重定向
        resp.sendRedirect("/mvc/login.jsp");

        //  5. 响应数据时 不需要页面跳转  需要响应json格式的数据   json格式数据？  "{username:'tom',password:'123456',age:20}"

        //  java  -> json 格式字符串  1. 手动拼接   2.借助工具类  fastJson

        // 设置响应的格式 和编码格式
        resp.setContentType("application/json;charset=utf-8");
        // resp.setCharacterEncoding("UTF-8");

        PrintWriter writer = resp.getWriter();
        writer.write("{username:'tom',password:'123456',age:20}");
        writer.close();

    }
}
